package com.demo.zk.server;

import org.apache.zookeeper.*;

import java.io.IOException;

/**
 * 分布式服务器
 * 服务器端，是要向zk注册自己
 * @author Jerry.Zeng
 * @version v1.0.0
 * @date 2021/9/22 15:37
 */
public class DistributeServer {

    /**
     * 连接客户单
     */
    private static final String connectString = "localhost:2181";
    /**
     * 超时时间 （毫秒）
     */
    private static final int sessionTimeout = 2000;
    /**
     * 客户端
     */
    private ZooKeeper zk = null;

    private final String parentNode = "/servers";

    public static void main(String[] args) throws Exception {
        // 1 获取zk连接
        DistributeServer server = new DistributeServer();
        server.getConnect();
        // 2 利用zk连接注册服务器信息
        server.registServer("服务器");
        // 3 启动业务功能
        server.business("服务器");
    }

    /**
     * 创建到zk的客户端连接
     * @throws IOException
     */
    public void getConnect() throws IOException {
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                @Override
                public void process(WatchedEvent event) {}
            });
    }

    /**
     * 注册服务器 - 其实就是创建临时节点，节点存在说明连接存在，连接断开，临时节点也会消失
     * @param hostname
     * @throws Exception
     */
    public void registServer(String hostname) throws Exception {
        String create = zk.create(
                // 节点路径
                parentNode + "/server",
                // 节点内容 - 主机名称
                hostname.getBytes(),
                // 权限
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                // 什么类型的节点 -e -s 临时+序列号
                CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println(hostname + " is online " + create);
    }

    /**
     * 业务功能
     * @param hostname
     * @throws Exception
     */
    public void business(String hostname) throws Exception {
        System.out.println(hostname + " is working ...");
        Thread.sleep(Long.MAX_VALUE);
    }

}
